package mockito_Function_Test;


import org.junit.Test;

import java.util.List;

import static org.mockito.Mockito.*;

/**
 * @Author: 一个普普通通的帅比
 * @CreateTime: 2022/11/1  0:17
 * @Description: 功能体验 —— 打桩/存根
 * @Version: 1.0
 */
public class MockitoTest_Stubbing {

    /**
     * 制作测试桩
     * <p>
     * 对于有返回值的函数：
     * when(方法).thenReturn(首次返回，第二、三、...次返回值);
     * 如果未申明返回值，默认返回 null / 0 / false
     */
    @Test
    public void stubTest1() {
        List mockedList = mock(List.class);
        when(mockedList.get(7)).thenReturn(7);  //设定方法执行事件
        System.out.println(mockedList.get(7));
        System.out.println(mockedList.size());  //返回值类型为数字类型的方法，若未设置测试桩则默认返回 0
        System.out.println(mockedList.add(2));  //返回值类型为布尔类型的方法，若未设置测试桩则默认返回 false
        System.out.println(mockedList.get(3));  //返回值类型为引用类型的方法，若未设置测试桩则默认返回 null
    }

    /**
     * 制作测试桩
     * <p>
     * 对于有返回值的函数：
     * when(方法).thenReturn(首次返回，第二、三、...次返回值);
     * 如果未申明返回值，默认返回 null / 0 / false
     */
    @Test
    public void stubTest2() {
        List mockedList = mock(List.class);
        when(mockedList.get(7)).thenReturn(7);  //设定方法执行事件
        System.out.println(mockedList.get(7));
        System.out.println(mockedList.size());  //返回值类型为数字类型的方法，若未设置测试桩则默认返回 0
        System.out.println(mockedList.add(2));  //返回值类型为布尔类型的方法，若未设置测试桩则默认返回 false
        System.out.println(mockedList.get(3));  //返回值类型为引用类型的方法，若未设置测试桩则默认返回 null
    }

    /**
     * 对于无返回值的函数,也可以使用存根：
     */
    @Test
    public void stubTest3() {
        List mockedList = mock(List.class);
        doThrow(new RuntimeException("hello")).when(mockedList).clear();
        doThrow(new RuntimeException("hello0000")).when(mockedList).get(0);
        mockedList.clear();
        mockedList.get(0);
    }
}
